import random
from flask import current_app
from flask import g
from flask import make_response
from api_v1 import redis_store, db
from flask import session
import re
import logging
# from sqlalchemy.sql.functions import user
from api_v1.models import User
from api_v1.utils.my_decorators import user_login_data
from api_v1.utils.qiniu_sdk import put_qiniu
from api_v1.utils.response_code import ret_map
from . import user_blue
from api_v1.utils.captcha.captcha import captcha
from flask import request, jsonify
from api_v1.utils.response_code import RET


# 图片验证码
# 请求路径: /user/yzm
# 请求方式: POST
# 请求参数: 无
# 返回值: errno, errmsg
@user_blue.route('/yzm')
def yzm():
    # 图片
    name, text, image = captcha.generate_captcha()
    print(text)

    # 储存图片到session
    session['image_code'] = text

    response = make_response(image)
    response.headers['Content-Type'] = 'iamge/jpeg'
    # 返回响应
    return response


# 短信验证码
# 请求路径: /user/sms_code
# 请求方式: POST
# 请求参数: mobile, image,image_code_id
# 返回值: errno, errmsg
@user_blue.route('/send_sms')
def send_sms():
    # 1获取参数
    # dict_data=request.json()
    # mobile=dict_data('mobile')
    # image_code=dict_data('image_code')
    # image_code_id=dict_data('image_code_id')
    phone = request.args.get("mobile")
    imageCode = request.args.get("imageCode")
    # image_code_id = request.args.get("image_code_id")

    # 2,校验参数
    # 2.1判断是否空值
    if not all([phone,imageCode]):
        return jsonify(code=RET.PARAMERR,msg='参数不全')
    # 2.2判断图片验证码是否正确
    # redis_image_code = redis_store.get("image_code:%s"%image_code_id)
    # if not redis_image_code:
    #     return jsonify(errno=RET.PARAMERR,errmsg="图片验证码过期")

    # redis_store.delete('image_code:%s'%image_code_id)    #删除上一个验证码

    if imageCode.lower() != session['image_code'].lower():
            return jsonify(code=RET.DATAERR,msg="图片验证码填写错误")
    # 2.2 手机格式
    if not re.match(r'1[3-9]\d{9}',phone):
        return jsonify(code=RET.PARAMERR,msg="手机号格式有误")

    # 3数据入库
    sms_code = "%06d"%random.randint(0,999999)
    current_app.logger.debug("sms_code = %s"%sms_code)
    redis_store.set("sms_code:%s"%phone,sms_code,300)
    print(sms_code)   # 在控制台输出验证码

    # 4返回响应
    return jsonify(code=RET.OK,msg='发送成功')


# 注册用户
# 请求路径: /user/register
# 请求方式: POST
# 请求参数: mobile, sms_code,password
# 返回值: errno, errmsg
@user_blue.route('/user_register', methods=['POST'])
def user_register():
    #1,获取参数
    dict_data =request.form
    phone=dict_data.get('mobile')
    sms_code=dict_data.get('phonecode')
    password1=dict_data.get('password')
    password2=dict_data.get('password2')

    if not all([phone, sms_code, password1, password2]):
        return jsonify(code=RET.PARAMERR,msg='参数不全')

    # 2，校验参数
    # 2.1判断用户是否存在
    count = User.query.filter(User.phone == phone).count()

    if count >0:
        return jsonify(code=RET.DATAERR,msg="用户已存在")
    # 2.2判断短信验证码是否正确
    redis_sms_code = redis_store.get("sms_code:%s" % phone)
    # if redis_sms_code != session.get('sms_yzm'):
    #     return jsonify(errno=RET.DATAERR, errmsg="短信验证码错误")

    if not redis_sms_code:
        return jsonify(code=RET.DATAERR, msg="短信验证码过期")

    if sms_code != redis_sms_code:
        return jsonify(code=RET.DATAERR, msg="短信验证码填写错误")
     # 验证手机号
    if not re.match(r'^1[34578]\d{9}$', phone):
        return jsonify(code=RET.PARAMERR, msg='手机号格式错误')

    # 验证两次密码是否一样
    if password1 != password2:
        return jsonify(code=RET.PARAMERR, msg='两次密码不一致')

    # 验证手机号是否已经注册
    if User.query.filter_by(phone=phone).count():
        return jsonify(code=RET.PARAMERR, msg='手机号已存在')

    # 3，数据入库
    try:
        user = User()
        user.name = phone
        user.password = password1

        user.phone= phone

        db.session.add(user)
        db.session.commit()
    except Exception as e:
        current_app.logger.error()
        return jsonify(code=RET.DATAERR,msg='注册失败')

    # 4，返回响应
    return jsonify(code=RET.OK,msg="发送成功")


# @user_blue.route("/session", methods=["POST"])
# 用戶登陸,退出
@user_blue.route("/session", methods=["POST",'DELETE'])
def longin():
    # 登陆接口
    if request.method == "DELETE":
        # 清楚session信息
        session.clear()
        return jsonify(code=RET.OK, msg="退出成功")

    # 獲取參數
    data = request.form
    mobile = data.get("mobile")
    passwd = data.get("password")
    #　校驗參數
    if not all([mobile, passwd]):
        return jsonify(code=RET.NODATA, msg="參數不全")
    user = User.query.filter(User.phone==mobile).first()
    if not user:
        return jsonify(code=RET.USERERR, msg="用戶不存在")
    if not user.check_pwd(passwd):
        return jsonify(code=RET.PWDERR, msg="密碼錯誤")

    # 狀態保持
    session["user_id"] = user.id
    session["user_name"] = user.name
    # 返回狀態
    return jsonify(code=RET.OK, msg="登陸成功")


@user_blue.route('/auth', methods=['PUT'])
@user_login_data
def user_auth_set():
    """用户实名认证"""
    # 获取参数
    data_dict = request.form
    id_name = data_dict.get('id_name')
    id_card = data_dict.get('id_card')
    user = g.user
    # 1.验证参数
    if not all([id_card, id_name]):
        return jsonify(code=RET.PARAMERR, msg=ret_map[RET.PARAMERR])
    if not re.match(r"^[1-9]\d{5}(19|20)\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$",id_card):
        return jsonify(code=RET.PARAMERR, msg=ret_map[RET.PARAMERR])

    # 2.验证身份证号是否已经存在
    try:
        if User.query.filter_by(id_card=id_card).count():
            return jsonify(code=RET.DATAEXIST, msg=ret_map[RET.DATAEXIST])
    except Exception as e:
        logging.error('查询数据库失败')
        return jsonify(code=RET.DBERR, msg=ret_map[RET.DBERR])

    # 3.修改用户的数据
    try:
        user.id_name = id_name
        user.id_card = id_card
        user.add_update()
    except Exception as e:
        logging.error('保存用户数据失败')
        return jsonify(code=RET.DBERR, msg=ret_map[RET.OK])

    # 4.返回应答
    return jsonify(code=RET.OK, msg=ret_map[RET.OK])


@user_blue.route('/auth', methods=['GET'])
@user_login_data
def user_auth():
    user = g.user
    # 返回用户的真实姓名、身份证号
    return jsonify(code=RET.OK, id_card=user.id_card, id_name=user.id_name)


@user_blue.route('/', methods=['GET', 'PUT'])
@user_login_data
def user_profile():
    """修改个人信息（用户名和头像）"""
    #获取参数
    data_dict = request.form
    print(data_dict)

    # user_id = session.get('user_id')
    # user = User.query.get(user_id)

    user = g.user

    if request.method == "GET":

        return jsonify(code=RET.OK, user=user.to_basic_dict())

    # 修改头像
    if 'avatar1' in data_dict:
        try:
            # 获取头像文件
            file_content = request.files.get('avatar')
            # mime-type:国际规范，表示文件的类型，如text/html,text/xml,image/png,image/jpeg..
            # 判断是否是图片类型文件
            if not re.match('image/.*',file_content.mimetype):
                return jsonify(code=RET.PARAMERR, msg='文件类型错误')
            print(file_content)
        except Exception as e:
            logging.error('获取用户图片文件错误')
            return jsonify(code=RET.PARAMERR,msg='获取图像文件错误')
            # 将图片上传到七牛
        avatar_url=put_qiniu(file_content)
        # 保存用户的头像信息
        try:
            user.avatar = avatar_url
            user.add_update()
        except Exception as e:
            logging.error('保存用户头像信息失败')
            return jsonify(code=RET.PWDERR,msg=ret_map[RET.DBERR])
        return jsonify(code=RET.OK,url=current_app.config['QINIU_URL']+avatar_url)
    elif 'name' in data_dict:
        # 修改用户名
        user_name = data_dict.get('name')

        if not user_name:
            return jsonify(code=RET.PARAMERR,msg=ret_map[RET.PARAMERR])
        # 判断用户是否存在
        try:
            if User.query.filter_by(name = user_name).count():
                return jsonify(code=RET.DATAEXIST,msg='用户名已存在')
        except Exception as e:
            logging.error('查询数据库失败')
            return jsonify(code=RET.DBERR,msg=ret_map[RET.DBERR])
        # 保存数据
        try:
            user.name=user_name
            user.add_update()
        except Exception as e:
            logging.error('保存用户名失效')
            return jsonify(code=RET.DBERR,msg=ret_map[RET.DBERR])
        return jsonify(code=RET.OK,msg='OK')
    else:
        return jsonify(code=RET.PARAMERR,msg=ret_map[RET.PARAMERR])


@user_blue.route('/session', methods=['GET'])
def is_login():
    """首页右上角显示用户是否登陆"""
    # session中获得id
    user_id = session.get("user_id")
    # 判断id没有返回用户未登录
    if not user_id:
        return jsonify(code=RET.UNKOWNERR, msg='用户未登陆')
    # 在数据库中取出来id
    user = User.query.get(user_id)
    # 没有返回用户未存在
    if not user:
        return jsonify(code=RET.USERERR , msg='用户未存在')
    # 找到获得id的名字
    return jsonify(code=RET.OK, msg='OK', name=user.name)

